package com.qf.controller;

import com.qf.pojo.User;
import com.qf.pojo.UserVo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Controller
@RequestMapping("/param")
public class ParamController {
    /**
     * 演示springMvc默认支持的接收参数类型:
     *         默认支持的参数就是可以加在方法参数上, 也可以不加, 可以按照自己需要添加删除
     *         HttpServletRequest,HttpSession, HttpServletResponse, Model
     *
     * 如果controller方法返回string字符串, 那么就认为这个字符串就是页面的路径, 会自动走视图解析器
     * 拼接视图解析器中的前缀和后缀组装成完整的页面路径
     */
    @RequestMapping("/test1")
    public String test1(HttpServletRequest request, HttpServletResponse response, Model model){
        String id = request.getParameter("id");
        String name = request.getParameter("name");

        System.out.println("===id====" + id);
        System.out.println("===name====" + name);

        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("id",id);
        model.addAttribute("name",name);
        //指定返回数据并跳转到hello页面
        return "hello";
    }
//    测试接收浏览器发送过来的基本类型参数
//    integer   float  double boolean string 等
    @RequestMapping("/test2")
    public String test2( Integer id, String name, Model model){
        System.out.println("===id====" + id);
        System.out.println("===name====" + name);

        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("id",id);
        model.addAttribute("name",name);
        //指定返回数据并跳转到hello页面
        return "hello";
    }
    /**
     * 接收pojo实体类, 类型参数
     * 使用: 浏览器传入的参数过多, 可以将这些参数封装成实体类来进行接收
     * @return
     */
    @RequestMapping("/test3")
    public String test3(User user,  Model model){
        System.out.println("===user====" + user);
        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("user",user);
        //指定返回数据并跳转到hello页面
        return "hello";
    }
    /**
     * 接收数组类型参数:
     *         一般页面中如果表单使用post方式提交, 那么chekbox复选框提交的内容, 一般都是数组.
     *         那么要求name属性名称, 必须等于接收的变量名
     * @return
     */
    @RequestMapping("/test4")
    public String test4(String[] hobby,  Model model){
        System.out.println("===hobby====" + hobby);
        //相当于request.setAttribute方法, 将数据放入请求域中带到页面中展示使用
        model.addAttribute("hobby",hobby);
        //指定返回数据并跳转到hello页面
        return "hello";
    }

    /**
     * 演示接收List类型参数, 一般行编辑需求的时候使用
     * @param model
     * @return
     */
    @RequestMapping("/test5")
    public String test5(UserVo vo, Model model){
        System.out.println("===userList====" + vo);
        //指定返回数据并跳转到hello页面
        return "hello";
    }
//    接收restful风格参数
//    访问路径：http://localhost:8080/类的路径/方法的路径/1/张三
    @RequestMapping("/test6/{xx}/{name}")
    public String test6(@PathVariable("xx") Integer id,
                        @PathVariable("name") String name)throws Exception{
        System.out.println("===userList====" + id + name);
//        手动转码,当参数个数过多时，手动转码不适合
        name = new String(name.getBytes(),"utf-8");

        //指定返回数据并跳转到hello页面
        return "hello";
    }
//  请求转发
    @RequestMapping("/test7")
    public String test7(Integer id,
                        String name,
                        Model model){
        System.out.println("===userList====" + id + name);
//        手动转码,当参数个数过多时，手动转码不适合

        model.addAttribute("id",id);
        model.addAttribute("name",name);
        return "forward:/param/test3";
    }
//重定向
    @RequestMapping("/test8")
    public String test8(Integer id,
                        String name,
                        Model model){
        System.out.println("===userList====" + id + name);
//        手动转码,当参数个数过多时，手动转码不适合

        model.addAttribute("id",id);
        model.addAttribute("name",name);
        return "redirect:http://www.baidu.com";
    }
}
